home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / pas / swag / crc.swg / 0010_16 & 32 BIT CRC.pas < prev    next >
Pascal/Delphi Source File  |  1993-08-27  |  1KB  |  69 lines

  1. {
  2. SAM LEVENTER
  3.  
  4. >    I'm not quite sure how CRC's work.  I have routines For calculating both
  5. > 16-bit and 32-bit CRC values, however, they seem to be only For one Byte.
  6. > How would I go about calculating the 16-bit CRC of an entire File?
  7.  
  8.   CRCs are CYCLIC redundancy codes.  That means that you cycle through the
  9. entire File, ORing it With the old CRC.
  10.  
  11. Just call updateCRC in the below Unit.
  12.  
  13. This Program is donated to the Public
  14. Domain by MarshallSoft Computing, Inc.
  15. It is provided as an example of the use
  16. of the Personal Communications Library.
  17. }
  18.  
  19. Unit mycrc16;
  20.  
  21. Interface
  22.  
  23. Function UpdateCRC(crc:Word;data:Byte):Word;
  24.  
  25. Implementation
  26.  
  27. Const
  28.   POLY = $1021;
  29.  
  30. Var
  31.   CRCtable : Array [0..255] of Word;
  32.  
  33. { compute updated CRC }
  34. Function  UpdateCRC(crc : Word; data : Byte) : Word;
  35. begin
  36.   UpDateCRC := (crc SHL 8) xor (CRCtable[(crc SHR 8) xor data]);
  37. end;
  38.  
  39. { initialize CRC table }
  40. Procedure InitCRC;
  41. Var
  42.   i : Integer;
  43.  
  44.   { calculate CRC table entry }
  45.   Function CalcTable(data, genpoly, accum : Word) : Word;
  46.   Var
  47.     i : Word;
  48.   begin
  49.     data := data SHL 8;
  50.     For i := 8 downto 1 do
  51.     begin
  52.       if ((data xor accum) and ($8000 <> 0)) then
  53.         accum := (accum SHL 1) xor genpoly
  54.       else
  55.         accum := accum SHL 1;
  56.       data := data SHL 1;
  57.     end;
  58.     CalcTable := accum;
  59.   end;
  60.  
  61. begin
  62.   For i := 0 to 255 do
  63.     CRCtable[i] := CalcTable(i, POLY, 0);
  64. end;
  65.  
  66. begin
  67.   InitCRC;
  68. end.
  69.